/*
 ============================================================================
 Name        : estrella.c
 Author      : Jorge García
 Version     :
 Copyright   : Bajo los terminos de la licencia GNU GPL V 3 y posteriores
 Description : Solución a la practica 1 de GC. Abarca todos los incisos se
 	 	 	   puede intercambiar con las teclas de función.
 ============================================================================
 */

#include <GL/glut.h>
#include <math.h>

//El valor de PI calculado lo mas preciso depoendiendo de la arquitectura
#define PI acos(-1)


void inicializa(void);
void dibuja(void);
void dibujaEstrella(int, int, float, float);
void tecladoEspecial(int, int, int);

int inciso; //Variable global para saber en que inciso de la practica estamos

int main(int argc, char* argv[]) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(640,480);
    glutInitWindowPosition(100, 150);
    glutCreateWindow("Practica 1");
    inicializa();

    glutSpecialFunc(tecladoEspecial);
    glutDisplayFunc(dibuja);
    glutMainLoop();
    return 0;
}

void inicializa() {
    glClearColor(1.0, 1.0, 1.0, 1.0);

    //Para el tercer inciso de la prectica es necesario desactivar el sombreado de Gouraud
    glShadeModel(GL_FLAT);

    //Por defecto el primer inciso de la practica
    inciso = 1;

    //Pongamos el sistema de referencia
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, 640.0, 0.0, 480.0);
}

void dibuja(void) {
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);

    dibujaEstrella(320, 240, 50.0, 200.0);

    glFlush();
}

void dibujaEstrella(int cx, int cy, float minRadio, float maxRadio) {
	float x[2], angle = PI / 2.0f, deltaAngle = 2.0 * PI / 10.0;
	int i;

	//Si el inciso es 1, hazlo con Line Loop si no con Triangle Fan
	glBegin(inciso == 1 ? GL_LINE_LOOP : GL_TRIANGLE_FAN);

		//Para dibujar con triangle fan necesitamos el vertice del centro
		if (inciso != 1) glVertex2i(cx, cy);

		for (i = 0; i <= 10; i++, angle += deltaAngle) {
			//Para el tercer inciso necestiamos cambiar de color en cada vertice
			if (inciso == 3) (i % 2 ? glColor3f(1.0, 0.0, 0.0) : glColor3f(1.0, 1.0, 0.0));
			//Si la iteracion es par, usa maxRadio si es non usa minRadio
			x[0] = (i % 2 ? minRadio : maxRadio) * cos(angle) + cx;
			x[1] = (i % 2 ? minRadio : maxRadio) * sin(angle) + cy;
			glVertex2fv(x);
		}
	glEnd();

	return;
}

void tecladoEspecial(int key, int mousex, int mousey) {

	//Cambia de inciso dependiento de la tecla F1, F2 o F3
	switch (key) {

		case GLUT_KEY_F1:
			inciso = 1;
		break;

		case GLUT_KEY_F2:
			inciso = 2;
		break;

		case GLUT_KEY_F3:
			inciso = 3;
		break;
	}

	//Importante despues de que cambies vuelve a pintar
	glutPostRedisplay();
	return;
}
